package util

import (
	"os"
	"path/filepath"
	"strings"
)

// 方法采取逐行读取文件中的内容以匹配符合条件的内容进行处理
//
//	 position 查找数据的位置
//		processingInContent 只处理节点中间的数据
//	 addContent 处理节点前后的数据
//	    addContent.positionStartIdx 节点开始位置
//	    addContent.positionEndIdx 节点结束位置
//	    addContent.contents 所有内容
func AddContentToFile(file, position string, processingInContent func(s string), addContent func(positionStartIdx, positionEndIdx int, contents []string) []string) (string, error) {
	var content string
	if isFile(file) {
		filename := filepath.Join(file)
		body, err := os.ReadFile(filename)
		if err != nil {
			return "", err
		}
		content = string(body)
	} else {
		content = file
	}

	contents := strings.Split(content, "\n")

	var (
		// 是否查找到文件节点
		positionIsFind bool
		// 节点结束位置
		positionEndIdx int
		// 节点开始位置
		positionStartIdx = -1
	)

	for i, s := range contents {
		if strings.Contains(s, position) {
			positionIsFind = true
			positionStartIdx = i
			continue
		}

		if position == "all" && !positionIsFind {
			positionIsFind = true
			positionStartIdx = i
		}

		if !positionIsFind {
			continue
		}

		// 结束默认以方法结束
		if strings.Contains(s, "}") && position != "all" {
			positionEndIdx = i
			break
		}

		processingInContent(s)
	}

	contents = addContent(positionStartIdx, positionEndIdx, contents)

	return strings.Join(contents, "\n"), nil
}

func isFile(v string) bool {
	fileInfo, err := os.Stat(v)
	if err != nil {
		return false
	}

	return fileInfo.Mode().IsRegular()
}

func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}
